package main

import "fmt"

func f(a [3]int) {
	a[2] = 10
	fmt.Printf("%p, %v\n", &a, a)
}

func main() {
	/*
		数组名 无论作为函数实参，还是作为struct嵌入字段，或者数组之间的直接赋值，都是值拷贝，不像C语言
		go语言中，数组的一切都是值拷贝：
		（1）数组间的直接赋值
		（2）数组作为函数参数
		（3）数组内嵌到 struct 中
	*/
	a := [...]int{1, 2, 3}
	//直接赋值是值拷贝
	b := a

	//修改 a 元素值并不影响 b
	a[2] = 4

	fmt.Printf("%p,%v\n", &a, a) //0xc0000aa078,[1 2 4]
	fmt.Printf("%p,%v\n", &b, b) //0xc0000aa090,[1 2 3]

	//数组作为函数参数仍然是值拷贝
	f(a) //0xc0000aa0d8, [1 2 10]

	c := struct {
		s [3]int
	}{
		s: a,
	}

	//结构是值拷贝，内部的数组也是值拷贝
	d := c

	//修改 c 中的数组元素并不影响 a
	c.s[2] = 30

	//修改 d 中的数组元素并不影响 c
	d.s[2] = 20

	fmt.Printf("%p,%v\n", &a, a) //0xc0000aa078,[1 2 4]
	fmt.Printf("%p,%v\n", &c, c) //0xc0000aa108,{[1 2 30]}
	fmt.Printf("%p,%v\n", &d, d) //0xc0000aa120,{[1 2 20]}
}
